package com.learning.java.optimize.design.pattern.observer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

/**
 * ClassName: InsuranceAcceptanceService
 * Description: 承保服务（重新设计）
 * Date: 2020/3/21 14:38 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
@Slf4j
@Service
public class InsuranceAcceptanceServiceDesign {

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 承保方法
     * 业务伪代码。忽略具体逻辑，参数封装、数据查询等
     */
    @Deprecated
    public void underwrite() {
        // 1. 承保业务操作
        log.info("1. 承保业务操作成功");

        // 2. 短信通知
        log.info("2. 短信通知，调用短信发送接口 -> XXX，您购买的XXX承保成功");

        // 3. APP通知
        log.info("3. APP通知，调用APP消息推送接口 -> XXX，您购买的XXX承保成功");

        // 4. 微信通知
        log.info("4. 微信通知，调用微信通知接口 -> XXX，您购买的XXX承保成功");
    }

    /**
     * 承保方法。
     * 利用Spring事件机制改造，利用观察者模式设计高扩展性的代码
     */
    public void underwriteDesign() {

        // 1. 承保业务操作
        log.info("承保业务操作");

        // 2. 发布承保成功事件
        InsuranceAcceptanceEvent acceptanceEvent = new InsuranceAcceptanceEvent("承保成功事件");
        applicationContext.publishEvent(acceptanceEvent);

        // 不需要其他业务操作。可以像扩展Spring一样，扩展我们的后续业务逻辑
    }
}
